package com.zian.utils;


import cn.hutool.core.lang.UUID;

import com.zian.exception.LoginException;
import com.zian.properties.JwtProperties;
import io.jsonwebtoken.*;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;

@Component
@RequiredArgsConstructor
public class JwtUtil {

    private final JwtProperties jwtProperties;

    //生成令牌
    public static String getUUID() {
        return UUID.randomUUID().toString().replaceAll("-", "");
    }




    /**
     * 生成jwt
     * 使用Hs256算法, 私匙使用固定秘钥
     *
     * @param subject 设置的信息
     * @return
     */
    public String createJWT(String subject) {
        // 指定签名的时候使用的签名算法，也就是header那部分
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;


        // 设置jwt的body
        JwtBuilder builder = Jwts.builder()
                .setId(getUUID())
                // 如果有私有声明，一定要先设置这个自己创建的私有的声明，这个是给builder的claim赋值，一旦写在标准的声明赋值之后，就是覆盖了那些标准的声明的
                .setSubject(subject)
                // 设置签名使用的签名算法和签名使用的秘钥
                .signWith(signatureAlgorithm, jwtProperties.getSecretKey().getBytes(StandardCharsets.UTF_8));

        return builder.compact();
    }






    /**
     * Token解密
     *
     * @param token 加密后的token
     * @return
     */
    /**
     * 解析jwt
     *
     * @param token
     * @return
     * @throws Exception
     */
    public Claims parseJWT(String token) {
        // 得到DefaultJwtParser
        Claims claims = null;

        try {
            claims = Jwts.parser()
                    // 设置签名的秘钥
                    .setSigningKey(jwtProperties.getSecretKey().getBytes(StandardCharsets.UTF_8))
                    // 设置需要解析的jwt
                    .parseClaimsJws(token)
                    .getBody();
        } catch (ExpiredJwtException | UnsupportedJwtException | MalformedJwtException | SignatureException |
                 IllegalArgumentException e) {
            throw new LoginException("登录异常");
        }

        return claims;
    }


}
